home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Reference Guide / C-C++ Interactive Reference Guide.iso / c_ref / csource4 / 280_01 / frqncy.c < prev    next >
Text File  |  1989-01-13  |  3KB  |  115 lines

  1. /* [FRQNCY.C of JUGPDS Vol.46] */
  2. /*
  3. *****************************************************************
  4. *                                *
  5. *    Written by  Hakuo Katayose (JUG-CP/M No.179)        *
  6. *            49-114 Kawauchi-Sanjuunin-machi        *
  7. *            Sendai, Miyagi 980                          *
  8. *            Phone: 0222-61-3219                *
  9. *                                *
  10. *       Modifird by Toshiya Oota   (JUG-CPM No.10)              *
  11. *                   Sakae ko-po 205                 *
  12. *            5-19-6 Hosoda                *
  13. *            Katusikaku Tokyo 124            *
  14. *                                *
  15. *        for MS-DOS Lattice C V3.1J & 80186/V20/V30    *
  16. *                                *
  17. *    Compiler Option: -ccu -k0(1) -ms -n -v -w        *
  18. *                                *
  19. *    Edited & tested by Y. Monma (JUG-CP/M Disk Editor)    *
  20. *            &  T. Ota   (JUG-CP/M Sub Disk Editor)    *
  21. *                                *
  22. *****************************************************************
  23. */
  24.  
  25. /* term - produce word frequency list for a text
  26.             K&P Exercise 4-24 in p.126 */
  27.  
  28. #include "stdio.h"
  29. #include "dos.h"
  30. #include "stdlib.h"
  31. #include "tools.h"
  32. #include "toolfunc.h"
  33.  
  34. #define MAXWORD 64
  35.  
  36. void treeprint();
  37.  
  38. struct tnode {
  39.     char  *word;
  40.     int   count;
  41.     struct tnode *left;
  42.     struct tnode *right;
  43. };
  44.  
  45. char    opt_f;        /* fold order        */
  46.  
  47. void main(argc, argv)
  48. int    argc;
  49. char *argv[];
  50. {
  51. struct tnode *root, *tree();
  52. char word[MAXWORD], *ap;
  53. int  t;
  54.     if (argc > 2)
  55.     error("FRQ999 Usage: frqncy [-f] <infile >outfile");
  56.     else
  57.     opt_f = OFF;
  58.     while (--argc > 0) {
  59.         ap = *++argv;
  60.         if (*ap++ == '-')
  61.         if (tolower(*ap) == 'f')
  62.             opt_f = ON;
  63.         else
  64.             error("FRQ999 Usage: frqncy [-f] <infile >outfile");
  65.     }
  66.     root = NULL;
  67.     while ((t = getword(word, MAXWORD)) != EOF) {
  68.     if (t == LETTER) {
  69.         if ((root = tree(root, word)) == NULL)
  70.         exit(puts("FRQ901 alloc overflow."));
  71.         }
  72.     }
  73.     treeprint(root);
  74. }
  75.  
  76. struct tnode *tree(p, w)
  77. struct tnode *p;
  78. char *w;
  79. {
  80. struct tnode *talloc();
  81. char *strsave();
  82. int  cond;
  83.     if (p == NULL)
  84.     if (((p = talloc()) == NULL) || (p->word = strsave(w)) == NULL)
  85.         return NULL;
  86.     else {
  87.         p->count = 1;
  88.         p->left = p->right = NULL;
  89.     }
  90.     else if ((cond = (opt_f == ON) ? strfcmp(w, p->word)
  91.          : strcmp(w, p->word)) == 0)
  92.         p->count++;
  93.     else if (cond < 0)
  94.         p->left = tree(p->left, w);
  95.     else
  96.         p->right = tree(p->right, w);
  97.     return(p);
  98. }
  99.  
  100. void treeprint(p)
  101. struct tnode *p;
  102. {
  103.     if (p != NULL) {
  104.     treeprint(p->left);
  105.     printf("%5d: %s\n", p->count, p->word);
  106.     treeprint(p->right);
  107.     }
  108. }
  109.  
  110.  
  111. struct tnode *talloc()
  112. {
  113.     return( (struct tnode *) malloc(sizeof(struct  tnode)) );
  114. }
  115.